#!/bin/sh

# probe device's VIDs and PIDs


function version()
{
	echo "$VERSION"
	exit 0
}

function commandlinehelp()
{
	echo "Usage:"
	echo "          $BASE [<switch>..] [dir]"
	echo "Switches:"
	echo "          --try-all              try all the synch .bin even if one is OK"
	echo "          --usb-init             reset modem between each synch .bin test"
	echo "          --no-prompt            don't prompt before loading firmware (only enabled if --usb-init is set)"
	echo "          --batch                disable default interactive mode"
	echo "          --version or -v        show version number then exit"
	echo "          --help or -h           show this help then exit"
	exit $1
}

function prompt()
{
	echo -ne "\n$1 your modem now, press ENTER to continue"
	read
}

function reset_usb()
{
	lsmod | grep $HUB > /dev/null
	if [ $? -eq 0 ]
	then
		if [ $PROMPT -eq 1 ]
		then
			prompt "Unplug"
		fi
		echo -e "\nResetting USB HUB.."
		modprobe -r $HUB > /dev/null
		if [ $? -ne 0 ]
		then
			echo "*** unable to unload $HUB, this might be an USB issue and you must reset is manually"
			exit 1
		fi
		sleep 1
		MSG="Replug"
	else
		MSG="Plug in"
	fi
	modprobe $HUB > /dev/null
	if [ $? -ne 0 ]
	then
		echo "*** unable to load $HUB, this might be an USB issue"
		exit 1
	fi
	if [ $PROMPT -eq 1 ]
	then
		prompt "$MSG"
	fi
	sleep 1
}

function init_modem()
{
	echo -e "\nLoading firmware.."
	$BIN_DIR/eci-load1 $ECILOAD1_OPTIONS 0x$VID1 0x$PID1 0x$VID2 0x$PID2 "$FIRMWARE" > /dev/null 2>&1
	if [ $? -eq 0 ]
	then
		echo "Firmware loaded"
	else
		echo "*** failed to load firmware, aborting"
		exit 1
	fi
}


# <CONFIG>
BIN_DIR="/usr/local/bin"
ETC_DIR="/etc"
CONF_DIR="/etc/eciadsl/"
PPPD_DIR="/etc/ppp"
VERSION=""
# </CONFIG>

BASE=${0##*/}
DIR=""
declare -i ALL=0 INTERACTIVE=1 FULL_INIT=0 PROMPT=1

while [ -n "$1" ]
do
	case "$1" in
		"--usb-init")		let FULL_INIT=1;;
		"--no-prompt")		let PROMPT=0;;
		"--try-all")		let ALL=1;;
		"--batch")			let INTERACTIVE=0;;
		"--version"|"-v")	version;;
		"--help"|"-h")		commandlinehelp 0;;
		*)					test -z "$DIR" && DIR=$1 || break;;
	esac
	shift
done

if [ $UID -ne 0 ]
then
	echo -e "\nYou must be root to run this script!"
#	exit 1
fi


echo -e "\nWARNING: if no $CONF_DIR/eciadsl.conf file exists,"
echo "default VID/PID will be assumed. This eciadsl.conf file is generated using"
echo "eciconf.sh or eciconftxt.sh, please read the INSTALL file to properly install"
echo "and configure the driver"
echo "This script requires your modem to be supported by the driver, and that"
echo "you've installed some extra synch .bin (the official synch_bin package for instance)"
echo "It might be also necessary to unplug/wait/replug your modem before your"
echo -e "this script and to ensure that no pppd/pppoeci instance is running\n"

ECILOAD1_OPTIONS=""
ECILOAD2_OPTIONS=""
if [ -f "$CONF_DIR/eciadsl.conf" ]; then
	VID1=`grep -iE "^[ \t]*VID1[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -1 | cut -f 2 -d '=' | tr -d " \t"`
	PID1=`grep -iE "^[ \t]*PID1[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -1 | cut -f 2 -d '=' | tr -d " \t"`
	VID2=`grep -iE "^[ \t]*VID2[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -1 | cut -f 2 -d '=' | tr -d " \t"`
	PID2=`grep -iE "^[ \t]*PID2[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -1 | cut -f 2 -d '=' | tr -d " \t"`
	FIRMWARE=`grep -iE "^[ \t]*FIRMWARE[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -1 | cut -f 2 -d '=' | tr -s "\t" " "`
	ECILOAD1_OPTIONS=`grep -iE "^[ \t]*ECILOAD1_OPTIONS[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -1 | cut -f 2 -d '=' | tr -s " \t" " "`
	ECILOAD2_OPTIONS=`grep -iE "^[ \t]*ECILOAD2_OPTIONS[ \t]*=" "$CONF_DIR/eciadsl.conf" | tail -1 | cut -f 2 -d '=' | tr -s " \t" " "`
	echo -e "\nConfig read from $CONF_DIR/eciadsl.conf"
else
	echo -e "\nDefault config assumed"
fi
test -z "$VID1" && VID1="0547"
test -z "$PID1" && PID1="2131"
test -z "$VID2" && VID2="0915"
test -z "$PID2" && PID2="8000"
test -z "$FIRMWARE" && FIRMWARE="$CONF_DIR/firmware00.bin"
test -z "$DIR" && DIR=$CONF_DIR

if [ $INTERACTIVE -eq 1 ]
then
	echo -e "\nType in a directory where to find the synch .bin"
	echo -en "[default is $DIR]: "
	read USERDIR
	test -n "$USERDIR" && DIR="$USERDIR"
fi

if [ ! -d "$DIR" ]
then
	echo -e "\n*** cannot access to $DIR"
	exit 1
fi

LIST=""
for FILE in $(find "$DIR" -maxdepth 1 -name "*.bin" | grep -v firm)
do
	test -n "$LIST" && LIST="$LIST\n${FILE##*/}" || LIST="${FILE##*/}"
done

if [ -z "$LIST" ]
then
	echo -e "\n*** no synch .bin has been found in $DIR, aborting"
	exit 1
fi

echo -e "\nThese synch .bin will be tested:"
echo -e "$LIST"
if [ $INTERACTIVE -eq 1 ]
then
	echo -en "Start the tests now? (Y/n) "
	read CONFIRM
	case $CONFIRM in
	Y|y|"")	;;
	*)		echo "*** cancelled by user, exiting"
			exit 1;;
	esac
fi

# HUB=usb-uhci

if [ $FULL_INIT -eq 0 ]
then
	init_modem
else
	echo -en "\nWhich USB HUB module is yours (common values are usb-uhci, usb-ohci or uhci)? "
	HUB=""
	while [ -z "$HUB" ]
	do
		read HUB
		if [ -z "$HUB" ]
		then
			echo -n "* you must enter a valid USB HUB module name, try again: "
		fi
	done
	reset_usb
fi

OLDIFS="$IFS"
IFS="
"
for FILE in $(echo -e "$LIST")
do
	if [ $FULL_INIT -eq 1 ]
	then
		init_modem
	fi

	echo -e "\nTesting synch with $DIR/$FILE.."
	$BIN_DIR/eci-load2 $ECILOAD2_OPTIONS 0x$VID2 0x$PID2 "$DIR/$FILE"
	if [ $? -eq 0 ]
	then
		test -n "$LISTOK" && LISTOK="$LISTOK\n$FILE" || LISTOK="$FILE"
		echo "$DIR/$FILE seems OK"
		test $ALL -eq 0 && break
	fi
	echo "Trying the next one.."
	sleep 1

	if [ $FULL_INIT -eq 1 ]
	then
		reset_usb
	fi
done
IFS="$OLDIFS"

if [ -z "$LISTOK" ]
then
	echo -e "\n** No valid synch .bin has been found"
	echo "There are many possible issues"
	echo "and it may be necessary to generate your own one. Please refer to"
	echo "the documentation in both cases."
else
	echo -e "\nThese synch .bin are supposed to be OK:"
	echo -e "$LISTOK"
fi
exit
